package com.vic.work_queues;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.vic.utils.RabbitmqUtils;

/**
 * 开启2个工作线程
 */
public class Consumer01 {

    public static void main(String[] argv) throws Exception {
        Channel channel = RabbitmqUtils.getChannel();

        // 消息处理
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");

            // 休眠 5 s
            try {
                Thread.sleep(5 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 参数一：deliveryTag:消息应答标记。
            // 参数二：multiple:(false、只应答接收到的那个消息 true、应答所有传递过来的消息)。
            // 处理完逻辑之后应答 ack
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
            System.out.println("接收到消息: " + message);
        };

        /**
         * 通过 Edit Configurations ->  Allow parallel run，可同时运行一段程序
         */
        System.out.println("T1工作线程等待接收消息...");

        // prefetchCount 的默认值为 0
        // 不设置（调用） basicQos 与 channel.basicQos(0) 的效果是等价的，即采用轮询分发的策略。
        channel.basicQos(2);

        // 手动应答
        boolean autoAck = false;
        channel.basicConsume(Consts.QUEUE_NAME, autoAck, deliverCallback, consumerTag -> {
            System.out.println(consumerTag);
        });
    }
}